﻿using MarkDownFileSplitter.Htm;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MarkDownFileSplitter.AIAnalaysis
{
    /**
     *  private void button1_Click(object sender, EventArgs e)
        {
            //文本提取测试
            string allText = File.ReadAllText(@"E:\数据\测试数据\Studio知识库测试\pdf\output.txt");
            string templateText = "1.1 编制背景";

            List<string> results = new HeadingTextExtracter().Extract(allText, templateText);
            foreach (var result in results)
            {
                this.richTextBox1.AppendText(result);
            }
        }
    **/
    /// <summary>
    /// /*
    /// </summary>
    internal class HeadingTextExtracter
    {
        /// <summary>
        /// 参照类型提取标题的测试方法。只能支持很少的文本，未使用。
        /// </summary>
        /// <returns></returns>
        public List<string> Extract(string allText, string selectedText)
        {
            List<string> answers = new List<string>();
            //尝试将文本分块处理
            int step = 800;
            int roundNum = allText.Length / step + 1;
            for (int i = 0; i < roundNum; i++)
            {
                int startIndex = i * step;
                int length = i < roundNum - 1 ? step : allText.Length - i * step;
                /*string requestContent = $"参考以下文字的格式和内容：'{selectedText}'，以上是单引号包含的是第一段文本。从第二段文本中提取出诸如'一、'、'1.1'、'1.1.1'的标题文字：'{allText.Substring(startIndex, length)}'，以上单引号包含的是第二段文本" +
                    $"提取的要求如下：提取后不需要总结内容、解释内容或添加额外的文字;" +
                    $"同一个等级的标题文字，在原文本中挨着的就是目录里的文字，需要将这些文字以及它前面对应的序号过滤掉（前面的序号是相似样式的就是同一个等级，比如'一、'和'二、'是同一个等级，'1.1'和'1.2'、'2.1'是同一个等级，'1.1.1'和'1.2.1'是同一个等级）";

                if (i < roundNum - 1)
                {
                    requestContent += $"由于我是直接截取指定长度的文本，所以可能会存在某些标题文字中途截断的情况，以下是截断位置的后100个字的文本'{allText.Substring(startIndex + length, 100)}'，以上单引号包含的是第三段文本。第三段文本是紧接着第二段文本的，判断一下第二段文本提取到的最后一个标题文字是否被截断了，如果被截断了，你需要从第三段文本中把被第二段文本被截断的标题文字补全，但不要从第三段文本中提取新的标题文本";
                }*/

                int maxLength = startIndex + length + 100 > allText.Length ? allText.Length : startIndex + length + 100;
                string requestContent = $"参考以下文字的格式和内容：'{selectedText}'，以上单引号包含的是第一段文本。'{allText.Substring(startIndex, maxLength - startIndex)}'，以上单引号包含的是第二段文本";


                if (startIndex + length + 100 > allText.Length)//最后一块文字
                {
                    requestContent += "从第二段文本中";
                }
                else//需要判断内容是否从中间被截断了，截断了则需要补全
                {
                    requestContent += $"{allText.Substring(startIndex + length, maxLength - startIndex - length)}是第二段文本的结尾区间，在这个区间找到最靠前面的分隔点（比如：'响应中央会议精神 1.1.3 对接住建部工作要求'，分隔点就是'会议精神'和'1.1.3 对接'中间的空格，但序号不一定是'1.1.3'，还可能是'一、'、'1.1'、'1.1.1'），注意是最靠前面的分隔点，然后把分隔点的位置设为终点。" +
                    $"截取第二段文本的起点到这个分隔点范围内的文本，作为第三段文本，然后从第三段文本中";
                }

                requestContent += $"提取出所有诸如'一、***'、'三、***'、'1.1 ***'、'3.2 ***'、'1.1.1 ***'、'4.2.3 ***'的标题文字：" +
                    $"提取的要求如下：1.提取后不需要总结内容，不需要解释内容，不需要添加额外的文字；2.提取所有符合条件的标题文字。";
                //$"同一个等级的标题文字，在原文本中挨着的就是目录里的文字，需要将这些文字以及它前面对应的序号过滤掉（前面的序号是相似样式的就是同一个等级，比如'一、'和'二、'是同一个等级，'1.1'和'1.2'、'2.1'是同一个等级，'1.1.1'和'1.2.1'是同一个等级）";

                string answer;

                if (GlobalSetting.Instance.AIMethod == "OpenRouter")
                {
                    answer = OpenRouterUtils.SendChatRequest(requestContent);
                    answers.Add(answer);
                }
                else if (GlobalSetting.Instance.AIMethod == "Ollama")
                {
                    answer = OllamaUtils.SendChatRequest(requestContent);
                    answers.Add(answer);
                }
            }
            return answers;
        }
    }
}
